/**
 * 
 */
package mm.front.jsf.validators;

import java.math.BigDecimal;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

/**
 * @author PUSDERKIS
 *
 */
public class BigDecimalValidator implements Validator {

	
	
	/**
	 * @see javax.faces.validator.Validator#validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
	 */
	
	
	public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException{
		
//		UIInput max = ((UIInput)JSFUtils.findComponent(context.getViewRoot(), (String)component.getAttributes().get("maximun")));
//		UIInput min = ((UIInput)JSFUtils.findComponent(context.getViewRoot(), (String)component.getAttributes().get("minimun"))); 
//		UIInput msg = ((UIInput)JSFUtils.findComponent(context.getViewRoot(), (String)component.getAttributes().get("message"))); 
		
		BigDecimal maximun,minimun;
		maximun = getBigDecimal(component.getAttributes().get("maximun"));
		minimun = getBigDecimal(component.getAttributes().get("minimun"));

		
		
		if ( maximun != null && (maximun.compareTo((BigDecimal)value) < 0 ) ){
			((UIInput)component).setValid(false);
		} else if (minimun != null && (minimun.compareTo((BigDecimal)value) > 0) ){
			((UIInput)component).setValid(false);
		} else {
			((UIInput)component).setValid(true);
		}
		
		
		if ( !((UIInput)component).isValid()){
			String message = "";
			if ("".equals(message)){
				StringBuffer sb = new StringBuffer();
				sb.append("El valor debe estar entre ").append(minimun).append(" y ").append(maximun).append(".");
				message = sb.toString();
			}
			
			FacesMessage fm = new FacesMessage(message);
			fm.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(component.getClientId(context), fm);
		}
		
	}
	
	private BigDecimal getBigDecimal(Object obj){
		BigDecimal bd = null; 
		
		if (obj instanceof BigDecimal){
			return (BigDecimal)obj;
		}
		
		if (obj != null){
			bd = new BigDecimal(obj.toString());
		}
		return bd;
	}

}
